<?php
/**
 * 予定一覧表示画面コントローラ
 * /Schedule/?ymd=20100730
 */
require_once 'Request/Request.php';
require_once 'Session.php';
require_once 'ZendPartial/input/hidden/HiddenController.php';
require_once 'ZendPartial/input/submit/SubmitController.php';
require_once 'ZendPartial/form/FormController.php';
require_once APPLICATION_PATH . '/views/Components/Calendar/Line.php';
require_once APPLICATION_PATH . '/views/Components/ScheduleNotice/Notice.php';
require_once APPLICATION_PATH . '/views/Components/ScheduleEdit/ScheduleEdit.php';
require_once APPLICATION_PATH . '/views/Components/ScheduleRegist/ScheduleRegist.php';
require_once APPLICATION_PATH . '/views/Components/CancelScheduleButton/CancelScheduleButtonController.php';
require_once APPLICATION_PATH . '/views/Components/DeleteScheduleButton/DeleteScheduleButtonController.php';
require_once APPLICATION_PATH . '/views/Components/SelectPurpose/SelectPurposeController.php';
require_once APPLICATION_PATH . '/views/Components/SelectDraftAge/SelectDraftAgeCotroller.php';
require_once APPLICATION_PATH . '/views/Components/StartTimeEndTime/StartTimeEndTimeController.php';
require_once APPLICATION_PATH . '/views/Components/Notice/NoticeController.php';
require_once APPLICATION_PATH . '/views/Components/RegistScheduleButton/RegistScheduleButtonController.php';
require_once APPLICATION_PATH . '/views/Components/BackToCalendarButton/BackToCalendarButtonController.php';
require_once APPLICATION_PATH . '/views/Components/MapSelect/MapSelectPartial.php';
require_once APPLICATION_PATH . '/models/Names/Names.php';
require_once APPLICATION_PATH . '/models/HttpRequest/HttpRequestController.php';
require_once APPLICATION_PATH . '/controllers/CalendarController.php';

/**
 * 予定画面コントロールクラス
 * <a href="https://www.evernote.com/shard/s89/sh/893b4b7c-b696-4bbf-8a75-39f2d3105628/c0787af6732aefdaece0672a19d4702c">開発メモ</a>
 */
class ScheduleController extends Zend_Controller_Action
{
	const WINDOW_TITLE1 = '予定追加';
	const WINDOW_TITLE2 = '予定編集';

	/** ラベル表示のＨＴＭＬコードを複数配列にして格納する */
	protected $_Label;
	/** フォームに設置する入力コントロールＨＴＭＬコードを複数配列にして格納する */
	protected $_Form;
	/** 画面遷移用アンカータグＨＴＭＬコードを複数配列にして格納する */
	protected $_Link;
	/** ジャバスクリプトコードを複数配列にして格納する */
	protected $_Js;
	/** 予定データモデルクラス */
	protected $_ModelSchedule;
	/** ＨＴＴＰリクエストクラス */
	protected $_Request;

	/**
	 * 初期化
	 * Enter description here ...
	 */
	public function init()
	{
		/* Initialize action controller here */
		$this->_Label = array();
		$this->_Form = array();
		$this->_Link = array();

		$this->_Request = new Lib_Request_DateTime();
	}

	/**
	 * INDEXアクション
	 * Enter description here ...
	 */
	public function indexAction()
	{
		// action body
		$objContents
		= new Components_Calendar_Line(
			'lt',Components_Calendar_Line::JUNIOR_SCHOOL
		);
		$sHtml = $objContents->fetch();
		$this->view->Contents = $sHtml;
	}

	/**
	 * スケジュール参照画面
	 * application/views/scripts/schedule/view.tpl
	 */
	public function viewAction()
	{
		/*** カレンダーモデルインスタンス */
		$objCalendar = new Models_Calendar_Xml_Controller();
		$yoteiList = $objCalendar->searchId($this->_Request->get(Names::YOTEIID));
		/*** 予定なし判定 */
		if ($yoteiList === FALSE) {
			$this->view->yoteiList = $yoteiList;
			return;
		}
		$this->view->yoteiList = TRUE;

		/*** 予定日取得 */
		$Label[Names::YOTEIBI] = $objCalendar->getYoteibi($this->_Request->get(Names::YOTEIID));
		/*** 招集目的取得 */
		$Label[Names::DRAFTPURPOSE] = $yoteiList[Models_Calendar_Controller::KEY_EVENT_CATEGORY];
		/*** 対象学年取得 */
		$Label[Names::DRAFTAGE] = $yoteiList[Models_Calendar_Controller::KEY_DRAFT_AGE];
		/*** 集合時刻取得 */
		$Label[Names::STARTTIME] = $yoteiList[Models_Calendar_Controller::KEY_START_TIME];
		/*** 解散時刻取得 */
		$Label[Names::ENDTIME] = $yoteiList[Models_Calendar_Controller::KEY_END_TIME];
		/*** おしらせ取得 */
		$Label[Names::NOTICE] = $yoteiList[Models_Calendar_Controller::KEY_NOTICE];

		/*** 集合場所地図リンクＵＲＬ取得 */
		$mapId = $yoteiList[Models_Calendar_Controller::KEY_MAP_ID];
		$objMap = new Models_Place_Xml_Controller();
		$mapInfo = $objMap->getDataById($yoteiList[Models_Calendar_Controller::KEY_MAP_ID]);
		if ( $mapInfo === FALSE){
			$this->view->mapLink  = FALSE;
			return;
		}
		$this->view->mapLink = TRUE;
		$Link[Names::ASSEMBLYYMAPLINK] = $mapInfo[Models_Place_Xml_Controller::KEY_MAPURL];
		/*** 集合場所名称取得 */
		$Label[Names::ASSEMBLYPLACE] = $mapInfo[Models_Place_Xml_Controller::KEY_NAME];

		/*** テンプレート通知 */
		$this->view->Label = $Label;
		$this->view->Link = $Link;
	}

	/**
	 * スケジュール編集画面
	 * application/views/scripts/schedule/edit.tpl<br />
	 * <a href="https://www.evernote.com/shard/s89/sh/087f8586-7ff4-4de1-8dfc-92349f9c2993/9781e0733e7f4643323e37640beedba8">開発メモ</a>
	 */
	public function editAction()
	{
		$objSession = new Lib_Session('Models_Calendar_Controller');
		/***
		 * 登録要求判定
		 */
		if ($this->_Request->get(Names::REGIST) != ''){
		/*** 登録ボタン投下 */
			/*** セッションクリア */
			$objSession->clear();
			// バリデートチェック
			$objCalendar = new Models_Calendar_Controller();
			if ($objCalendar->validateHttpRequestForInsert()){
				$this->_redirectToRegist($this->_Request->get(Names::REGIST));
			}else{
			//バリッドエラー
				$errorName = $objCalendar->HttpRequest->InvalidKey;
				$this->view->errorName = $errorName;
			}
		} else if ($this->_Request->get(Names::STOP) == Names::NAME_BUTTON_STOP) {
		/*** 中止ボタン */
			/*** セッションクリア */
			$objSession->clear();
			/*** 予定中止画面（予定登録画面）にリダイレクト */
			$this->_redirectToRegist(Names::STOP);
		} else if ($this->_Request->get(Names::DELETE) == Names::NAME_BUTTON_DELETE){
		// 削除ボタン
			/*** セッションクリア  */
			$objSession->clear();
			/** 予定登録画面にリダイレクト */
			$this->_redirectToRegist(Names::DELETE);
		} else if ($this->_Request->get(Names::BACK) == Names::NAME_BUTTON_BACK){
		// 戻るボタン
			/*** セッションクリア */
			$objSession->clear();
			/*** カレンダー画面にリダイレクト */
			$this->_redirectToCalendar();
		} else if ($this->_Request->get(Names::ADD_ASSEMBLY) == Names::NAME_BUTTON_ADD_ASSEMBLY) {
		// 集合場所登録ボタン
			/*** HTTPリクエストから不要な遷移もと情報を削除する */
			unset($_REQUEST['done']);
			/*** HTTPリクエストをセッションに保存する*/
			$objSession->setValue(Models_Calendar_Controller::SESSION_KEY_DATASET, $_REQUEST);
			$this->_redirectToAddAssembly();
		}

		/***
		 * 初期画面判定
		 * SESSIONにデータセットが保持されていない場合、初期画面と判定する
		 */
		$sessionDataset = $objSession->getValue(Models_Calendar_Controller::SESSION_KEY_DATASET);
		if (!empty($sessionDataset)) {
			$_REQUEST = $objSession->getValue(Models_Calendar_Controller::SESSION_KEY_DATASET);
		}

		/*** 登録内容セッションクリア */
		$objSession->clear();

		/*** カレンダー情報インスタンス作成 */
		$objCalendar = new Models_Calendar_Xml_Controller();

		/***
		 * 予定登録用ＨＩＤＤＥＮ
		 */
		$objRegistValueHidden = new ZendPatrial_Input_HiddenController('');
		$aryHiddenHtml = array();

		/***
		 * 設置部品群
		 */
		/*** 編集フォーム */
		$objForm = new ZendPartial_FormController(Names::YOTEI_EDIT,'','post');
		$this->_Form[Names::YOTEI_EDIT][Names::START] = $objForm->fetchStart();
		$this->_Form[Names::YOTEI_EDIT][Names::END] = $objForm->fetchEnd();

		/*** ウィンドータイトル */
		$this->_Label[Names::PAGETITLE]= self::getWindowTitle();
		/*** 予定日 */
		$this->_Label[Names::YOTEIBI]
		=$objCalendar->getYoteibi();
		/*** 中止ボタン */
		$objStop = new ZendPartial_Input_SubmitController(Names::STOP, Names::NAME_BUTTON_STOP);
		$this->_Form[Names::STOP]=$objStop->fetch();
		/*** 削除ボタン */
		$objDelete = new ZendPartial_Input_SubmitController(Names::DELETE, Names::NAME_BUTTON_DELETE);
		$this->_Form[Names::DELETE]=$objDelete->fetch();

		/*** 集合場所選択メニュー */
		$objAssenbly = new Components_MapSelect_Partial($objCalendar);
		$this->_Form[Names::ASSEMBLYPLACE]=$objAssenbly->fetchPulldownMenu();
		$this->_Js[Names::ASSEMBLYPLACE] = $objAssenbly->fetchYMapOpenFetch(Names::YOTEI_EDIT);
		/***  集合場所選択メニュー選択結果バリュー設定ＨＩＤＤＥＮ */
		$objRegistValueHidden->NAME = Components_MapSelect_Partial::HTTP_NAME;
		$aryHiddenHtml[] = $objRegistValueHidden->fetch();

		/*** 集合場所追加画面リンク */
		$this->_Link[Names::MAPREGISTPAGEID]='';
		/** 集合場所追加ボタン */
		$objAssenblyAddButton = new ZendPartial_Input_SubmitController(Names::ADD_ASSEMBLY,Names::NAME_BUTTON_ADD_ASSEMBLY);
		$this->_Form[Names::ADD_ASSEMBLY] = $objAssenblyAddButton->fetch();
		/*** 集合場所確認Ｙ！マップリンク */
		$this->_Link[Names::ASSEMBLYYMAPLINK]='';

		/** 集合時刻メニュー（時）*/
		$objTimeMenu
		= new Components_StartTimeEndTimeController(
				$objCalendar
				);
		$this->_Form[Names::STARTTIMEHOUR] = $objTimeMenu->fetchStartHour();
		/*** 集合時刻メニュー（時）選択結果バリュー設定ＨＩＤＤＥＮ */
		$objRegistValueHidden->NAME = Names::STARTTIMEHOUR;
		$aryHiddenHtml[] = $objRegistValueHidden->fetch();

		/** 集合時刻メニュー（分） */
		$this->_Form[Names::STARTTIMEMINUTE] = $objTimeMenu->fetchStartMinute();
		/** 集合時刻メニュー（分）選択結果バリュー設定ＨＩＤＤＥＮ */
		$objRegistValueHidden->NAME = Names::STARTTIMEMINUTE;
		$aryHiddenHtml[] = $objRegistValueHidden->fetch();

		/** 解散時刻メニュー（時） */
		$this->_Form[Names::ENDTIMEHOUR] = $objTimeMenu->fetchEndHour();
		/** 解散時刻メニュー（時）選択結果バリュー設定ＨＩＤＤＥＮ */
		$objRegistValueHidden->NAME = Names::ENDTIMEHOUR;
		$aryHiddenHtml[] = $objRegistValueHidden->fetch();

		/** 解散時刻メニュー（分） */
		$this->_Form[Names::ENDTIMEMINUTE] = $objTimeMenu->fetchEndMinute();
		/** 解散時刻メニュー（分）選択結果バリュー設定ＨＩＤＤＥＮ */
		$objRegistValueHidden->NAME = Names::ENDTIMEMINUTE;
		$aryHiddenHtml[] = $objRegistValueHidden->fetch();

		/** 招集学年選択チェックボックス */
		if (empty($_REQUEST[Names::DRAFTAGE])) {
			$objSelectDraftAge
			= new Components_SelectDraftAgeController(
					$objCalendar
					);
		} else {
			$objSelectDraftAge = new Components_SelectDraftAgeController();
		}
		$this->_Form[Names::DRAFTAGE] = $objSelectDraftAge;
		/** 招集学年選択チェックボックス選択結果バリュー設定ＨＩＤＤＥＮ */
		$objRegistValueHidden->NAME = $objSelectDraftAge->NAME;
		$aryHiddenHtml[] = $objRegistValueHidden->fetch();

		/** 招集目的ラジオボタン */
		$objSelectPurpose
		= new Components_SelectPurposeController(
				$objCalendar
				);
		$this->_Form[Names::DRAFTPURPOSE] = $objSelectPurpose->fetchRadioList();
		/** 招集目的ラジオボタン選択結果バリュー設定ＨＩＤＤＥＮ */
		$objRegistValueHidden->NAME = $objSelectPurpose->NAME;
		$aryHiddenHtml[] = $objRegistValueHidden->fetch();

		/** お知らせテキストエリア */
		if (isset($_REQUEST[Models_Calendar_Controller::KEY_NOTICE])) {
			$objNotice = new Components_NoticeController();
		} else {
			$objNotice = new Components_NoticeController($objCalendar);
		}
		$objNotice->Rows = 4;
		$objNotice->Cols =40;
		$this->_Form[Names::NOTICE] =$objNotice->fetch();
		/** お知らせテキストエリア入力バリュー設定ＨＩＤＤＥＮ */
		$objRegistValueHidden->NAME = $objNotice->NAME;
		$aryHiddenHtml[] = $objRegistValueHidden->fetch();

		/** 登録ボタン */
		$sFunctionNameOnClick = Names::REGIST.'(this)';
		$sOnClickEventProperty = 'onClick="' . $sFunctionNameOnClick . '"';
		$objRegistButton = new Components_RegistScheduleButtonController($sOnClickEventProperty);
		$sNameRegistButton = Names::NAME_BUTTON_INSERT;
		if ($this->_Request->get(Names::YOTEIID) != '') {
			$sNameRegistButton = Names::NAME_BUTTON_UPDATE;
		}
		$objRegistButton = new ZendPartial_Input_SubmitController(Names::REGIST, $sNameRegistButton);
		$this->_Form[Names::REGIST] = $objRegistButton->fetch();
		/** 登録データＨＩＤＤＥＮ枠 */

		/** 戻るボタン */
		$objBackButton = new ZendPartial_Input_SubmitController(Names::BACK, Names::NAME_BUTTON_BACK);

		$this->_Form[Names::BACK] = $objBackButton->fetch( );

		/**
		 * 変更追加判定
		 */
		$changeFlg = FALSE;//先ずは、変更を想定
		/** 判定　*/
		if ($this->_Request->get(Names::YOTEIID) != ''){
			$changeFlg = TRUE;
		}

		 /**
		 * テンプレート通知
		 */
		$this->view->Label = $this->_Label;
		$this->view->Form = $this->_Form;
		$this->view->Link = $this->_Link;
		$this->view->Js = $this->_Js;
		$this->view->HIDDEN = $aryHiddenHtml;
		$this->view->changeFlg = $changeFlg;
		$this->view->YoteiId = $this->_Request->get(Names::YOTEIID);
		$this->view->Year = $this->_Request->getYear();
		$this->view->Month = sprintf('%02d', $this->_Request->getMonth());
		if ($this->_Request->get(Names::YOTEIID) == '') {
			$this->view->YoteiBi = $this->_Request->getDay();
		}
	}

	/**
	 * スケジュール追加画面
	 * Enter description here ...
	 */
	public function addAction()
	{
		$this->view->TITLE = '予定追加';
		$objContents = new Components_ScheduleEdit('SCD', Components_AgeCheckbox::JUNIOR_SCHOOL, '/Schedule/regist');
		$sContents = $objContents->fetch();
		$this->view->CONTENTS = $sContents;
	}

	/**
	 * スケジュール登録完了画面
	 * <br /><a href="https://www.evernote.com/shard/s89/sh/fef1382e-aa3b-4b08-965c-9fa583a777f9/39cd4573daaa431df28ca6378d3dcbd0">編集メモ</a>
	 * /application/views/scripts/schedule/regist.tpl
	 */
	public function registAction()
	{
		$returnUrl = '';
		$result = FALSE;
		$strRequest = '';
		$objRequest = new Lib_Request_DateTime();
		$objCalendar = new Models_Calendar_Xml_Controller();

		$sessionKey = get_parent_class($objCalendar);
		$objSession = new Lib_Session($sessionKey);
		$formSession = $objSession->getValue(Models_Calendar_Controller::SESSION_KEY_DATASET);
		$id = $formSession[Names::YOTEIID];

		switch ($objRequest->get(Names::ORDER)){
			case Names::NAME_BUTTON_INSERT:
				$result = $objCalendar->addFromSession();
				$strRequest = Names::NAME_BUTTON_INSERT;
				break;
			case Names::NAME_BUTTON_UPDATE:
				$result = $objCalendar->updateFromSession();
				$strRequest = Names::NAME_BUTTON_UPDATE;
				break;
			case Names::STOP:
				$result = $objCalendar->setStopFlg($id);
				$strRequest = Names::STOP;
				break;
			case Names::DELETE:
				$result = $objCalendar->delelte($id);
				$strRequest = Names::DELETE;
				break;
		}

		/*** データセット変更結果判定 */
		if ( $result !== FALSE ) {
			/*** データ保存 */
			$result = $objCalendar->saveToFile();
			/***復帰画面URL取得 */
			$_REQUEST[Lib_Request_DateTime::KEY_YEAR] = $objCalendar->getYearFromFileName();
			$_REQUEST[Lib_Request_DateTime::KEY_MONTH] = $objCalendar->getMonthFromFileName();
			$returnUrl = CalendarController::getSelf('vt');
		}
		$this->view->objRequest = $objRequest;
		$this->view->RegistResult = $result;
		$this->view->returnUrl = $returnUrl;
		$this->view->Request = $strRequest;
		
		/*** セッションクリア */
		$objSession->clear();
	}

	/**
	 * 連絡事項オーバーレイ用
	 * Enter description here ...
	 */
	public function noticeAction()
	{
		$objContents
		= new Components_ScheduleNotice_Notice('scn');

		$sHtml = $objContents->fetch();
		$this->view->Contents = $sHtml;
	}

	/**
	 * 予定編集フォーム設置用ＨＩＤＤＥＮ生成
	 */
	protected function _setViewHiddenRegist()
	{
		$objHidden = new ZendPatrial_Input_HiddenController($Name);
		$objHidden->NAME = Components_MapSelect_Partial::HTTP_NAME;
	}

	/**
	 * 予定日取得
	 * ＨＴＴＰリクエストに予定ＩＤが指定されている場合は
	 * 該当予定の予定日を返す
	 * そうでない場合は、ＨＴＴＰリクエストに設定されている年月日を返す
	 * それもない場合は、現在年月日を返す。
	 * 書式：9999年z9月z9日（曜日）
	 */
	public function getYoteibi()
	{
		$objHttpRequest = new Lib_Request_DateTime();
		if ($objHttpRequest->get(Names::YOTEIID) != ''){

		}
	}

	/**
	 * ウィンドータイトル取得
	 * ＨＴＴＰリクエストに予定ＩＤが指定されている場合は「予定編集」
	 * そうでない場合は「予定追加」
	 */
	public static function getWindowTitle()
	{
		$objHttpRequest = new Lib_Request();
		if ($objHttpRequest->get(Names::YOTEIID) == '') {
			return self::WINDOW_TITLE1;
		}else{
			return self::WINDOW_TITLE2;
		}
	}

	/**
	 * 予定表示画面ＵＲＬを生成する
	 * @param  $Id 予定ＩＤ
	 */
	static public function createDetailUrl($Id)
	{
		$sResult = 'detail/?id='.$Id;
		return $sResult;
	}

	/**
	 * 登録画面に遷移する
	 * @param unknown_type $order
	 */
	protected function _redirectToRegist($order)
	{
		/*** HTTPリクエストをセッションに保存する*/
		$objSession = new Lib_Session('Models_Calendar_Controller');
		$objSession->setValue(Models_Calendar_Controller::SESSION_KEY_DATASET, $_REQUEST);
		/*** 登録画面に遷移する */
		$this->_redirect(
				'/Schedule/regist'
				. '?' . Names::ORDER . '=' . $order
				. '&' . Lib_Request_DateTime::KEY_YEAR . '=' . $this->_Request->getYear()
				. '&' . Lib_Request_DateTime::KEY_MONTH . '=' . sprintf('%02d', $this->_Request->getMonth())
		);
		exit;
	}

	/**
	 * 集合場所登録画面に遷移する
	 */
	protected function _redirectToAddAssembly() {
		/*** 集合場所登録画面に遷移する */
		$prmDone = Lib_Request::deletePramKey($_SERVER["REQUEST_URI"], 'done');
		$prmDone = urlencode($prmDone);
		$this->_redirect(Names::URL_PLACEADD.'?done=' . $prmDone);

		exit();
	}

	/**
	 * カレンダー画面に遷移する
	 */
	protected function _redirectToCalendar()
	{
		$this->_redirect(
				'/Calendar/vt'
				. '?' . Lib_Request_DateTime::KEY_YEAR . '=' . $this->_Request->getYear()
				. '&' . Lib_Request_DateTime::KEY_MONTH . '=' . sprintf('%02d', $this->_Request->getMonth())
				);
		exit;
	}

}